package com.dys.testrelect02;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * @className: com.dys.testrelect02.Test4
 * @description: 获取方法和调用方法
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/08/27 下午10:33
 */
public class Test4 {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        // 1.获取字节码信息
        Class<Student> cls = Student.class;

        // 2.获取方法
        // getMethods(): 只能获取被public修饰的方法
        Method[] methods = cls.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

        // 获取运行时类中的所有方法
        System.out.println("===========================");
        Method[] declaredMethods = cls.getDeclaredMethods();
        for (Method method : declaredMethods) {
            System.out.println(method);
        }

        // 获取指定方法
        System.out.println("------------------------");
        Method showInfo1 = cls.getMethod("showInfo");
        System.out.println(showInfo1);
        Method showInfo2 = cls.getMethod("showInfo", int.class, int.class);
        System.out.println(showInfo2);
        // 获取私有方法
        Method work = cls.getDeclaredMethod("work", int.class);
        System.out.println(work);

        // 获取方法的具体结构
        /*
         * @注解、访问修饰符、返回值类型、方法名(形参列表) throws 异常
         * */
        System.out.println("*********************");
        // 获取方法名
        System.out.println(work.getName());
        // 获取访问修饰符
        int modifiers = work.getModifiers();
        System.out.println(Modifier.toString(modifiers));
        // 获取返回值类型
        Class<?> returnType = work.getReturnType();
        System.out.println(returnType);
        // 获取形参列表
        Class<?>[] parameterTypes = work.getParameterTypes();
        for (Class<?> parameterType : parameterTypes) {
            System.out.println(parameterType);
        }
        // 获取注解
        Method myMethod = cls.getMethod("myMethod");
        Annotation[] annotations = myMethod.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println(annotation);
        }
        // 获取异常
        Class<?>[] exceptionTypes = myMethod.getExceptionTypes();
        for (Class<?> exceptionType : exceptionTypes) {
            System.out.println(exceptionType);
        }

        // 调用方法
        System.out.println("-------------------------");
        Student stu = cls.newInstance();
        myMethod.invoke(stu);
        System.out.println(showInfo2.invoke(stu, 12, 22));
    }
}
